package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 当集合元素已经实现Comparable接口，但是该比较规则不满足排序需求时，也可以使用重载的sort
 * 方法临时指定一个比较规则进行排序.
 *
 * 例如:排序字符串String.
 */
public class SortListDemo3 {
    public static void main(String[] args) {
        /*
            Collection.sort(List list)
            该方法要求集合元素必须实现可比较的接口Collection,否则编译不通过.
            这样做对我们的程序具有侵入性。因此当不能使用该方法时就不建议使用。

            侵入性:当我们调用某个API的方法时，该方法要求我们为其修改其他地方的代码后才能工作时.
            这样的行为就是侵入性，它不利于代码的后期维护.
         */
//        Collections.sort(list);//没实现接口Comparable:定义元素之间比较大小.
        /** Collection.sort(List list):排序*/
        List<String> list = new ArrayList<>();
        list.add("巴拉巴拉");
        list.add("黑魔仙");
        list.add("啦啦啦德玛西亚~");
        list.add("小魔仙");
        list.add("为了诺克萨斯");
        list.add("盖聂");
        System.out.println(list);
        /** 一: 有入侵性 -> Comparator:比较器 */
//        Comparator<String> c = new Comparator<String>() {
//            @Override
//            public int compare(String o1, String o2) {
//                Integer t1 = o1.length();
//                Integer t2 = o2.length();
//                return t1-t2;
//            }
//        };
//        Collections.sort(list,c);
        /** 二: 解决入侵 */
//        Collections.sort(list, new Comparator<String>() {
//            @Override
//            public int compare(String o1, String o2) {
//                Integer t1 = o1.length();
//                Integer t2 = o2.length();
//                return t1-t2;
//            }
//        });
        /** lambda: 表达式 */
        Collections.sort(list,
                (o1, o2) -> o1.length() - o2.length());
        System.out.println(list);
        //从大到小
        Collections.sort(list,
                (o1, o2) -> o2.length() - o1.length());
        System.out.println(list);
    }
}
